package com.codedef.common.response;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Result<T> {

    // 操作代码
    int code;

    // 提示信息
    String message;

    // 结果数据
    T data;

    /**
     * 自定义消息的构造函数
     * @param message 提示语
     */
    public Result(String message) {
        this.message = message;
    }

    /**
     * 通过ResultCode枚举类的构造函数
     * @param resultCode 返回值的枚举类
     */
    public Result(ResultCode resultCode) {
        this.code = resultCode.code();
        this.message = resultCode.message();
    }

    /**
     * 通过ResultCode枚举类、添加有效载荷的构造函数
     * @param resultCode 返回值的枚举类
     * @param data 有效数据
     */
    public Result(ResultCode resultCode, T data) {
        this.code = resultCode.code();
        this.message = resultCode.message();
        this.data = data;
    }


    /**
     * 通用的 SUCCESS 返回方法
     * @return Result
     */
    public static Result SUCCESS() {
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 自定义有效载荷的 SUCCESS 返回方法
     * @param data 有效载荷
     * @return
     */
    public static <T> Result SUCCESS(T data) {
        return new Result(ResultCode.SUCCESS, data);
    }


    /**
     * 通用的 FAIL 返回方法
     * @return Result
     */
    public static Result FAIL() {
        return new Result(ResultCode.FAIL);
    }

    /**
     * 通过ResultCode枚举类创建的 SUCCESS 返回方法
     * @param resultCode
     * @return
     */
    public static Result FAIL(ResultCode resultCode) {
        return new Result(resultCode);
    }

    /**
     * 自定义有效载荷的 FAIL 返回方法
     * @param data 有效载荷
     * @return
     */
    public static <T> Result FAIL(T data) {
        return new Result(ResultCode.FAIL, data);
    }


    /* Getter 与 Setter 方法开始 */
    public int getCode() {
        return code;
    }

    public Result setCode(int code) {
        this.code = code;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public T getData() {
        return data;
    }

    public Result setData(T data) {
        this.data = data;
        return this;
    }
    /* Getter 与 Setter 方法结束 */

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}